/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Automato;

import Estado.Estado;
import Estado.StateArrow;
import java.util.ArrayList;

/**
 *
 * @author Aluno
 */
public class KeywordsBag {

    public ArrayList<Integer> actualKeywordsBag = new ArrayList<Integer>();
    //StateArrow arrow = new StateArrow();
    ArrayList<StateArrow> arrows = new ArrayList<StateArrow>();
     public ArrayList<FraseId> FraseIdBag = new ArrayList<FraseId>();
    Estado e = new Estado(-1); 
            
    int EstadoDeOrigem;

    public int getEstadoDeOrigem() {
        return EstadoDeOrigem;
    }

    public void setEstadoDeOrigem(int EstadoDeOrigem) {
        this.EstadoDeOrigem = EstadoDeOrigem;
    }

    
    /* public ArrayList<Integer> Intercept(ArrayList<StateArrow> lst) {
       ArrayList<Integer> NewActualKeywordsBag = new ArrayList<Integer>();
       ArrayList<Integer> lstTemp = new ArrayList<Integer>();
       int size = lst.size();
       
       
       
       for (int i = 0; i < size; i++){
           lstTemp.addAll(lst.get(i).getFrases());
         }
       
       if (!(lstTemp.containsAll(actualKeywordsBag))) {
            for (int i = 0; i < actualKeywordsBag.size(); i++) {
                if (lstTemp.contains(actualKeywordsBag.get(i))) {
                   FraseIdBag.get(getIndexOfFraseIDBag(actualKeywordsBag.get(i))); 
                    NewActualKeywordsBag.add(actualKeywordsBag.get(i));
                    
                    
                }
            }
            
            return NewActualKeywordsBag;
        }
        return this.actualKeywordsBag;
    }
    
    */
    
     public void Intercept(ArrayList<StateArrow> lst) {
       ArrayList<Integer> NewActualKeywordsBag = new ArrayList<Integer>();
       ArrayList<Integer> lstTemp = new ArrayList<Integer>();
       ArrayList<FraseId> FraseIdBagTemp = new ArrayList<FraseId>();
       
       int size = lst.size();
       
       
       
       
       for (int i = 0; i < size; i++){
           lstTemp.addAll(lst.get(i).getFrases());
         }
       
       if (!(lstTemp.containsAll(actualKeywordsBag))) {
            for (int i = 0; i < actualKeywordsBag.size(); i++) {
                if (lstTemp.contains(actualKeywordsBag.get(i))) {
                   
                    FraseIdBagTemp.add(FraseIdBag.get(getIndexOfFraseIDBag(actualKeywordsBag.get(i)))); 
                    NewActualKeywordsBag.add(actualKeywordsBag.get(i));
                 
                    
                }
            }
            
           actualKeywordsBag=NewActualKeywordsBag;
           FraseIdBag=FraseIdBagTemp;
        }
        
    }
    
    
    public void addNew(ArrayList<Integer> lst) {
        actualKeywordsBag.removeAll(actualKeywordsBag);
        actualKeywordsBag = lst;

    }

    public void addInicios(ArrayList<Integer> lst) {
        //e preciso verificar se ja la esta algum pois pode haver duas palavras
        //que se repetem na mesma frase.

        int size = lst.size();
        for (int i = 0; i < size; i++) {
            if (!(actualKeywordsBag.contains(lst.get(i)))) {
                actualKeywordsBag.add(lst.get(i));
                FraseId fr =new FraseId();
                fr.setNovaInstancia();
                fr.setId(lst.get(i));
                FraseIdBag.add(fr);
                
            }else{
            //vai buscar o index onde o FraseId esta, retorna-o e adicona-lhe
           //     uma nova instancia ao coint
            FraseIdBag.get(getIndexOfFraseIDBag(lst.get(i))).setNovaInstancia();
            
            
            }
        }
    }

    public boolean CheckFim(int id) {

        if (actualKeywordsBag.contains(id)) {
            return true;
        } else {
            return false;
        }

    }

    //Recebe uma lista e retorna outra so com os ids de frases que
    //estao na KeywordsBag
    public ArrayList<Integer> CheckFins(ArrayList<Integer> lst, Estado e) {
int a;
        ArrayList<Integer> fins = new ArrayList<Integer>();
        int size = lst.size();
     
        for (int i = 0; i < size; i++) {
            if (actualKeywordsBag.contains(lst.get(i)) /*&& ContainsArrowTo(e.getId())*/) {
                fins.add(lst.get(i));
            }
        }

        return fins;
    }
    
    
    public void removeFromBag(int id)
    {
        for(int i=0;i<actualKeywordsBag.size();i++)
            if(id==actualKeywordsBag.get(i))
                actualKeywordsBag.remove(i);    
    }
    
    public boolean LastState(int id, Estado e)
{
        for(int i=0;i<e.getCaminhos().size();i++)
            if(e.getCaminhos().get(i).getPalavra()==id)
               return true;
       return false;
      
    }
    
   // public StateArrow getArrow(){return arrow;}
    
    public void RemoveAll(){actualKeywordsBag.clear();}
    
    public boolean ContainsArrowTo(int id)
   {      for(int i=0;i<arrows.size();i++)
              if(arrows.get(i).getPalavra()==id)
                  return true;
          return false;
    }
    
    /* Percorre a lista de arrows e remove os ids das frases para os quais nao
     * ha arrows a apontar.
    */
    public void RemoveFrasesNaoApontadas(int id)
   {    int p=0;  
        
        for(int i=0;i<arrows.size();i++)
              if(arrows.get(i).getPalavra()!=id)
              {
                 for(int j=0;j<arrows.get(i).getFrases().size();j++)
                     if(!actualKeywordsBag.contains(arrows.get(i).getFrase(j)))
                     {
                         //if(getIndexOfFraseIDBag(arrows.get(i).getFrase(j))!= -1)
                         //FraseIdBag.remove(FraseIdBag.get(getIndexOfFraseIDBag(arrows.get(i).getFrase(j))));
                         
                         removeFromBag(arrows.get(i).getFrase(j));
                         
                     }
                     p++;
                         
              }
      }
    
    
    public boolean ArrowsIsEmpty()
   {      if(arrows.isEmpty())
              return true;
          return false;
    }
    public void AddArrows(ArrayList<StateArrow> arr)
   {    arrows.clear();  
        arrows.addAll(arr);
    }
    
    public void Reset()
  {
        arrows.clear();
        actualKeywordsBag.clear();
    }
    
    public void addEstadoToBag(Estado est){e=est;}
    
    public Estado getEstado(){return e;}
    
    public int getIndexOfFraseIDBag(int id)
    {
        for(int i=0;i<FraseIdBag.size();i++)
        {if(FraseIdBag.get(i).getId()==id)
             return i;
        
        
        }
    return -1;
    
    }
    
     public int getMaxCounterFromFraseID(int id)
    {
        for(int i=0;i<FraseIdBag.size();i++)
        {
            if(FraseIdBag.get(i).getId()==id)
             return FraseIdBag.get(i).getValorMaxDoCount();
        
        
        }
    return -1;
    
    }
    
     public FraseId getFraseIDFromBag(int id)
    {
        for(int i=0;i<FraseIdBag.size();i++)
        {if(FraseIdBag.get(i).getId()==id)
             return FraseIdBag.get(i);
        
        
        }
    return null;
    
    }
     
     public void IncrementaContadorParaTodos()
{
         for(int i=0;i<FraseIdBag.size();i++)
         FraseIdBag.get(i).IncrmentaCont();
     }
    
    public boolean Contains(int id)
    {
        for(int i=0;i<FraseIdBag.size();i++)
        {if(FraseIdBag.get(i).getId()==id)
             return true;
        
        
        }
    return false;
    
    }
}   

